package com.rainbow.idempotent;

import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;

import com.rainbow.idempotent.enums.IdempotentStorageTypeEnum;
import com.rainbow.idempotent.request.IdempotentRequest;
import com.rainbow.idempotent.storage.IdempotentStorage;

/**
 * 幂等接口
 *
 */
public interface DistributedIdempotent {

    /**
     * 幂等执行
     * @param key 幂等Key
     * @param lockExpireTime 锁的过期时间
     * @param storeExpireTime 记录存储的过期时间
     * @param timeUnit 存储时间单位
     * @param idempotentStorageTypeEnum 幂等记录存储的处理方案
     * @param execute 要执行的逻辑
     * @param fail Key已经存在，幂等拦截后的执行逻辑
     * @return
     */
    <T> T execute(String key, int lockExpireTime,int storeExpireTime, TimeUnit timeUnit, IdempotentStorageTypeEnum  idempotentStorageTypeEnum, Supplier<T> execute, Supplier<T> fail);

    /**
     * 幂等执行
     * @param key 幂等Key
     * @param lockExpireTime 锁的过期时间
     * @param storeExpireTime 记录存储的过期时间
     * @param timeUnit 存储时间单位
     * @param idempotentStorageTypeEnum 幂等记录存储的处理方案
     * @param execute 要执行的逻辑
     * @param fail Key已经存在，幂等拦截后的执行逻辑
     * @return
     */
    <T> T execute(String key, int lockExpireTime,int storeExpireTime, TimeUnit timeUnit, IdempotentStorageTypeEnum  idempotentStorageTypeEnum,IdempotentStorage idempotentStorageCustom ,Supplier<T> execute, Supplier<T> fail);
    
    /**
     * 幂等执行
     * @param request 幂等参数
     * @param execute 要执行的逻辑
     * @param fail Key已经存在，幂等拦截后的执行逻辑
     * @return
     */
    <T> T execute(IdempotentRequest request, Supplier<T> execute, Supplier<T> fail);

    /**
     * 幂等执行
     * @param key 幂等Key
     * @param lockExpireTime 锁的过期时间
     * @param storeExpireTime 记录存储的过期时间
     * @param timeUnit 存储时间单位
     * @param idempotentStorageTypeEnum 幂等记录存储的处理方案
     * @param execute 要执行的逻辑
     * @param fail Key已经存在，幂等拦截后的执行逻辑
     * @return
     */
    void execute(String key, int lockExpireTime, int storeExpireTime,TimeUnit timeUnit, IdempotentStorageTypeEnum  idempotentStorageTypeEnum, Runnable execute, Runnable fail);

    /**
     * 幂等执行
     * @param key 幂等Key
     * @param lockExpireTime 锁的过期时间
     * @param storeExpireTime 记录存储的过期时间
     * @param timeUnit 存储时间单位
     * @param idempotentStorageTypeEnum 幂等记录存储的处理方案
     * @param execute 要执行的逻辑
     * @param fail Key已经存在，幂等拦截后的执行逻辑
     * @return
     */
    void execute(String key, int lockExpireTime, int storeExpireTime,TimeUnit timeUnit, IdempotentStorageTypeEnum  idempotentStorageTypeEnum,IdempotentStorage idempotentStorageCustom , Runnable execute, Runnable fail);
    /**
     * 幂等执行
     * @param request 幂等参数
     * @param execute 要执行的逻辑
     * @param fail Key已经存在，幂等拦截后的执行逻辑
     * @return
     */
    void execute(IdempotentRequest request, Runnable execute, Runnable fail);

}